/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- * vim: set ts=8 sts=4 et sw=4 tw=99: * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */#ifndef jit_x86_shared_Assembler_x86_shared_h#define jit_x86_shared_Assembler_x86_shared_h#include<cstddef>#include"jit/shared/Assembler-shared.h"#if defined(JS_CODEGEN_X86)# include "jit/x86/BaseAssembler-x86.h"#elif defined(JS_CODEGEN_X64)# include "jit/x64/BaseAssembler-x64.h"#else# error "Unknown architecture!"#endifnamespacejs{namespacejit{structScratchFloat32Scope:publicAutoFloatRegisterScope{explicitScratchFloat32Scope(MacroAssembler&masm):AutoFloatRegisterScope(masm,ScratchFloat32Reg){}};structScratchDoubleScope:publicAutoFloatRegisterScope{explicitScratchDoubleScope(MacroAssembler&masm):AutoFloatRegisterScope(masm,ScratchDoubleReg){}};structScratchSimd128Scope:publicAutoFloatRegisterScope{explicitScratchSimd128Scope(MacroAssembler&masm):AutoFloatRegisterScope(masm,ScratchSimd128Reg){}};classOperand{public:enumKind{REG,MEM_REG_DISP,FPREG,MEM_SCALE,MEM_ADDRESS32};private:Kindkind_:4;// Used as a Register::Encoding and a FloatRegister::Encoding.uint32_tbase_:5;Scalescale_:3;// We don't use all 8 bits, of course, but GCC complains if the size of// this field is smaller than the size of Register::Encoding.Register::Encodingindex_:8;int32_tdisp_;public:explicitOperand(Registerreg):kind_(REG),base_(reg.encoding()),scale_(TimesOne),index_(Registers::Invalid),disp_(0){}explicitOperand(FloatRegisterreg):kind_(FPREG),base_(reg.encoding()),scale_(TimesOne),index_(Registers::Invalid),disp_(0){}explicitOperand(constAddress&address):kind_(MEM_REG_DISP),base_(address.base.encoding()),scale_(TimesOne),index_(Registers::Invalid),disp_(address.offset){}explicitOperand(constBaseIndex&address):kind_(MEM_SCALE),base_(address.base.encoding()),scale_(address.scale),index_(address.index.encoding()),disp_(address.offset){}Operand(Registerbase,Registerindex,Scalescale,int32_tdisp=0):kind_(MEM_SCALE),base_(base.encoding()),scale_(scale),index_(index.encoding()),disp_(disp){}Operand(Registerreg,int32_tdisp):kind_(MEM_REG_DISP),base_(reg.encoding()),scale_(TimesOne),index_(Registers::Invalid),disp_(disp){}explicitOperand(AbsoluteAddressaddress):kind_(MEM_ADDRESS32),base_(Registers::Invalid),scale_(TimesOne),index_(Registers::Invalid),disp_(X86Encoding::AddressImmediate(address.addr)){}explicitOperand(PatchedAbsoluteAddressaddress):kind_(MEM_ADDRESS32),base_(Registers::Invalid),scale_(TimesOne),index_(Registers::Invalid),disp_(X86Encoding::AddressImmediate(address.addr)){}AddresstoAddress()const{MOZ_ASSERT(kind()==MEM_REG_DISP);returnAddress(Register::FromCode(base()),disp());}BaseIndextoBaseIndex()const{MOZ_ASSERT(kind()==MEM_SCALE);returnBaseIndex(Register::FromCode(base()),Register::FromCode(index()),scale(),disp());}Kindkind()const{returnkind_;}Register::Encodingreg()const{MOZ_ASSERT(kind()==REG);returnRegister::Encoding(base_);}Register::Encodingbase()const{MOZ_ASSERT(kind()==MEM_REG_DISP||kind()==MEM_SCALE);returnRegister::Encoding(base_);}Register::Encodingindex()const{MOZ_ASSERT(kind()==MEM_SCALE);returnindex_;}Scalescale()const{MOZ_ASSERT(kind()==MEM_SCALE);returnscale_;}FloatRegister::Encodingfpu()const{MOZ_ASSERT(kind()==FPREG);returnFloatRegister::Encoding(base_);}int32_tdisp()const{MOZ_ASSERT(kind()==MEM_REG_DISP||kind()==MEM_SCALE);returndisp_;}void*address()const{MOZ_ASSERT(kind()==MEM_ADDRESS32);returnreinterpret_cast<void*>(disp_);}boolcontainsReg(Registerr)const{switch(kind()){caseREG:returnr.encoding()==reg();caseMEM_REG_DISP:returnr.encoding()==base();caseMEM_SCALE:returnr.encoding()==base()||r.encoding()==index();default:returnfalse;}}};inlineImm32Imm64::firstHalf()const{returnlow();}inlineImm32Imm64::secondHalf()const{returnhi();}classCPUInfo{public:// As the SSE's were introduced in order, the presence of a later SSE implies// the presence of an earlier SSE. For example, SSE4_2 support implies SSE2 support.enumSSEVersion{UnknownSSE=0,NoSSE=1,SSE=2,SSE2=3,SSE3=4,SSSE3=5,SSE4_1=6,SSE4_2=7};staticSSEVersionGetSSEVersion(){if(maxSSEVersion==UnknownSSE)SetSSEVersion();MOZ_ASSERT(maxSSEVersion!=UnknownSSE);MOZ_ASSERT_IF(maxEnabledSSEVersion!=UnknownSSE,maxSSEVersion<=maxEnabledSSEVersion);returnmaxSSEVersion;}staticboolIsAVXPresent(){if(MOZ_UNLIKELY(maxSSEVersion==UnknownSSE))SetSSEVersion();MOZ_ASSERT_IF(!avxEnabled,!avxPresent);returnavxPresent;}private:staticSSEVersionmaxSSEVersion;staticSSEVersionmaxEnabledSSEVersion;staticboolavxPresent;staticboolavxEnabled;staticboolpopcntPresent;staticboolneedAmdBugWorkaround;staticvoidSetSSEVersion();public:staticboolIsSSE2Present(){#ifdef JS_CODEGEN_X64returntrue;#elsereturnGetSSEVersion()>=SSE2;#endif}staticboolIsSSE3Present(){returnGetSSEVersion()>=SSE3;}staticboolIsSSSE3Present(){returnGetSSEVersion()>=SSSE3;}staticboolIsSSE41Present(){returnGetSSEVersion()>=SSE4_1;}staticboolIsSSE42Present(){returnGetSSEVersion()>=SSE4_2;}staticboolIsPOPCNTPresent(){returnpopcntPresent;}staticboolNeedAmdBugWorkaround(){returnneedAmdBugWorkaround;}staticvoidSetSSE3Disabled(){maxEnabledSSEVersion=SSE2;avxEnabled=false;}staticvoidSetSSE4Disabled(){maxEnabledSSEVersion=SSSE3;avxEnabled=false;}staticvoidSetAVXEnabled(){avxEnabled=true;}};classAssemblerX86Shared:publicAssemblerShared{protected:structRelativePatch{int32_toffset;void*target;Relocation::Kindkind;RelativePatch(int32_toffset,void*target,Relocation::Kindkind):offset(offset),target(target),kind(kind){}};Vector<RelativePatch,8,SystemAllocPolicy>jumps_;CompactBufferWriterjumpRelocations_;CompactBufferWriterdataRelocations_;voidwriteDataRelocation(ImmGCPtrptr){if(ptr.value){if(gc::IsInsideNursery(ptr.value))embedsNurseryPointers_=true;dataRelocations_.writeUnsigned(masm.currentOffset());}}protected:X86Encoding::BaseAssemblerSpecificmasm;typedefX86Encoding::JmpSrcJmpSrc;typedefX86Encoding::JmpDstJmpDst;public:AssemblerX86Shared(){if(!HasAVX())masm.disableVEX();}enumCondition{Equal=X86Encoding::ConditionE,NotEqual=X86Encoding::ConditionNE,Above=X86Encoding::ConditionA,AboveOrEqual=X86Encoding::ConditionAE,Below=X86Encoding::ConditionB,BelowOrEqual=X86Encoding::ConditionBE,GreaterThan=X86Encoding::ConditionG,GreaterThanOrEqual=X86Encoding::ConditionGE,LessThan=X86Encoding::ConditionL,LessThanOrEqual=X86Encoding::ConditionLE,Overflow=X86Encoding::ConditionO,CarrySet=X86Encoding::ConditionC,CarryClear=X86Encoding::ConditionNC,Signed=X86Encoding::ConditionS,NotSigned=X86Encoding::ConditionNS,Zero=X86Encoding::ConditionE,NonZero=X86Encoding::ConditionNE,Parity=X86Encoding::ConditionP,NoParity=X86Encoding::ConditionNP};// If this bit is set, the vucomisd operands have to be inverted.staticconstintDoubleConditionBitInvert=0x10;// Bit set when a DoubleCondition does not map to a single x86 condition.// The macro assembler has to special-case these conditions.staticconstintDoubleConditionBitSpecial=0x20;staticconstintDoubleConditionBits=DoubleConditionBitInvert|DoubleConditionBitSpecial;enumDoubleCondition{// These conditions will only evaluate to true if the comparison is ordered - i.e. neither operand is NaN.DoubleOrdered=NoParity,DoubleEqual=Equal|DoubleConditionBitSpecial,DoubleNotEqual=NotEqual,DoubleGreaterThan=Above,DoubleGreaterThanOrEqual=AboveOrEqual,DoubleLessThan=Above|DoubleConditionBitInvert,DoubleLessThanOrEqual=AboveOrEqual|DoubleConditionBitInvert,// If either operand is NaN, these conditions always evaluate to true.DoubleUnordered=Parity,DoubleEqualOrUnordered=Equal,DoubleNotEqualOrUnordered=NotEqual|DoubleConditionBitSpecial,DoubleGreaterThanOrUnordered=Below|DoubleConditionBitInvert,DoubleGreaterThanOrEqualOrUnordered=BelowOrEqual|DoubleConditionBitInvert,DoubleLessThanOrUnordered=Below,DoubleLessThanOrEqualOrUnordered=BelowOrEqual};enumNaNCond{NaN_HandledByCond,NaN_IsTrue,NaN_IsFalse};// If the primary condition returned by ConditionFromDoubleCondition doesn't// handle NaNs properly, return NaN_IsFalse if the comparison should be// overridden to return false on NaN, NaN_IsTrue if it should be overridden// to return true on NaN, or NaN_HandledByCond if no secondary check is// needed.staticinlineNaNCondNaNCondFromDoubleCondition(DoubleConditioncond){switch(cond){caseDoubleOrdered:caseDoubleNotEqual:caseDoubleGreaterThan:caseDoubleGreaterThanOrEqual:caseDoubleLessThan:caseDoubleLessThanOrEqual:caseDoubleUnordered:caseDoubleEqualOrUnordered:caseDoubleGreaterThanOrUnordered:caseDoubleGreaterThanOrEqualOrUnordered:caseDoubleLessThanOrUnordered:caseDoubleLessThanOrEqualOrUnordered:returnNaN_HandledByCond;caseDoubleEqual:returnNaN_IsFalse;caseDoubleNotEqualOrUnordered:returnNaN_IsTrue;}MOZ_CRASH("Unknown double condition");}staticvoidStaticAsserts(){// DoubleConditionBits should not interfere with x86 condition codes.JS_STATIC_ASSERT(!((Equal|NotEqual|Above|AboveOrEqual|Below|BelowOrEqual|Parity|NoParity)&DoubleConditionBits));}staticConditionInvertCondition(Conditioncond);staticConditionUnsignedCondition(Conditioncond);staticConditionConditionWithoutEqual(Conditioncond);staticDoubleConditionInvertCondition(DoubleConditioncond);// Return the primary condition to test. Some primary conditions may not// handle NaNs properly and may therefore require a secondary condition.// Use NaNCondFromDoubleCondition to determine what else is needed.staticinlineConditionConditionFromDoubleCondition(DoubleConditioncond){returnstatic_cast<Condition>(cond&~DoubleConditionBits);}staticvoidTraceDataRelocations(JSTracer*trc,JitCode*code,CompactBufferReader&reader);// MacroAssemblers hold onto gcthings, so they are traced by the GC.voidtrace(JSTracer*trc);booloom()const{returnAssemblerShared::oom()||masm.oom()||jumpRelocations_.oom()||dataRelocations_.oom();}voiddisableProtection(){masm.disableProtection();}voidenableProtection(){masm.enableProtection();}voidsetLowerBoundForProtection(size_tsize){masm.setLowerBoundForProtection(size);}voidunprotectRegion(unsignedchar*first,size_tsize){masm.unprotectRegion(first,size);}voidreprotectRegion(unsignedchar*first,size_tsize){masm.reprotectRegion(first,size);}voidsetPrinter(Sprinter*sp){masm.setPrinter(sp);}staticconstRegistergetStackPointer(){returnStackPointer;}voidexecutableCopy(void*buffer);boolasmMergeWith(constAssemblerX86Shared&other){MOZ_ASSERT(other.jumps_.length()==0);if(!AssemblerShared::asmMergeWith(masm.size(),other))returnfalse;returnmasm.appendBuffer(other.masm);}voidprocessCodeLabels(uint8_t*rawCode);voidcopyJumpRelocationTable(uint8_t*dest);voidcopyDataRelocationTable(uint8_t*dest);// Size of the instruction stream, in bytes.size_tsize()const{returnmasm.size();}// Size of the jump relocation table, in bytes.size_tjumpRelocationTableBytes()const{returnjumpRelocations_.length();}size_tdataRelocationTableBytes()const{returndataRelocations_.length();}// Size of the data table, in bytes.size_tbytesNeeded()const{returnsize()+jumpRelocationTableBytes()+dataRelocationTableBytes();}public:voidhaltingAlign(intalignment){masm.haltingAlign(alignment);}voidnopAlign(intalignment){masm.nopAlign(alignment);}voidwriteCodePointer(CodeOffset*label){// A CodeOffset only has one use, bake in the "end of list" value.masm.jumpTablePointer(LabelBase::INVALID_OFFSET);label->bind(masm.size());}voidcmovz(constOperand&src,Registerdest){switch(src.kind()){caseOperand::REG:masm.cmovz_rr(src.reg(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.cmovz_mr(src.disp(),src.base(),dest.encoding());break;caseOperand::MEM_SCALE:masm.cmovz_mr(src.disp(),src.base(),src.index(),src.scale(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidmovl(Imm32imm32,Registerdest){masm.movl_i32r(imm32.value,dest.encoding());}voidmovl(Registersrc,Registerdest){masm.movl_rr(src.encoding(),dest.encoding());}voidmovl(constOperand&src,Registerdest){switch(src.kind()){caseOperand::REG:masm.movl_rr(src.reg(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.movl_mr(src.disp(),src.base(),dest.encoding());break;caseOperand::MEM_SCALE:masm.movl_mr(src.disp(),src.base(),src.index(),src.scale(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.movl_mr(src.address(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidmovl(Registersrc,constOperand&dest){switch(dest.kind()){caseOperand::REG:masm.movl_rr(src.encoding(),dest.reg());break;caseOperand::MEM_REG_DISP:masm.movl_rm(src.encoding(),dest.disp(),dest.base());break;caseOperand::MEM_SCALE:masm.movl_rm(src.encoding(),dest.disp(),dest.base(),dest.index(),dest.scale());break;caseOperand::MEM_ADDRESS32:masm.movl_rm(src.encoding(),dest.address());break;default:MOZ_CRASH("unexpected operand kind");}}voidmovl(Imm32imm32,constOperand&dest){switch(dest.kind()){caseOperand::REG:masm.movl_i32r(imm32.value,dest.reg());break;caseOperand::MEM_REG_DISP:masm.movl_i32m(imm32.value,dest.disp(),dest.base());break;caseOperand::MEM_SCALE:masm.movl_i32m(imm32.value,dest.disp(),dest.base(),dest.index(),dest.scale());break;caseOperand::MEM_ADDRESS32:masm.movl_i32m(imm32.value,dest.address());break;default:MOZ_CRASH("unexpected operand kind");}}voidxchgl(Registersrc,Registerdest){masm.xchgl_rr(src.encoding(),dest.encoding());}// Eventually vmovapd should be overloaded to support loads and// stores too.voidvmovapd(FloatRegistersrc,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vmovapd_rr(src.encoding(),dest.encoding());}voidvmovaps(FloatRegistersrc,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vmovaps_rr(src.encoding(),dest.encoding());}voidvmovaps(constOperand&src,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src.kind()){caseOperand::MEM_REG_DISP:masm.vmovaps_mr(src.disp(),src.base(),dest.encoding());break;caseOperand::MEM_SCALE:masm.vmovaps_mr(src.disp(),src.base(),src.index(),src.scale(),dest.encoding());break;caseOperand::FPREG:masm.vmovaps_rr(src.fpu(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvmovaps(FloatRegistersrc,constOperand&dest){MOZ_ASSERT(HasSSE2());switch(dest.kind()){caseOperand::MEM_REG_DISP:masm.vmovaps_rm(src.encoding(),dest.disp(),dest.base());break;caseOperand::MEM_SCALE:masm.vmovaps_rm(src.encoding(),dest.disp(),dest.base(),dest.index(),dest.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidvmovups(constOperand&src,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src.kind()){caseOperand::MEM_REG_DISP:masm.vmovups_mr(src.disp(),src.base(),dest.encoding());break;caseOperand::MEM_SCALE:masm.vmovups_mr(src.disp(),src.base(),src.index(),src.scale(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvmovups(FloatRegistersrc,constOperand&dest){MOZ_ASSERT(HasSSE2());switch(dest.kind()){caseOperand::MEM_REG_DISP:masm.vmovups_rm(src.encoding(),dest.disp(),dest.base());break;caseOperand::MEM_SCALE:masm.vmovups_rm(src.encoding(),dest.disp(),dest.base(),dest.index(),dest.scale());break;default:MOZ_CRASH("unexpected operand kind");}}// vmovsd is only provided in load/store form since the// register-to-register form has different semantics (it doesn't clobber// the whole output register) and isn't needed currently.voidvmovsd(constAddress&src,FloatRegisterdest){masm.vmovsd_mr(src.offset,src.base.encoding(),dest.encoding());}voidvmovsd(constBaseIndex&src,FloatRegisterdest){masm.vmovsd_mr(src.offset,src.base.encoding(),src.index.encoding(),src.scale,dest.encoding());}voidvmovsd(FloatRegistersrc,constAddress&dest){masm.vmovsd_rm(src.encoding(),dest.offset,dest.base.encoding());}voidvmovsd(FloatRegistersrc,constBaseIndex&dest){masm.vmovsd_rm(src.encoding(),dest.offset,dest.base.encoding(),dest.index.encoding(),dest.scale);}// Although vmovss is not only provided in load/store form (for the same// reasons as vmovsd above), the register to register form should be only// used in contexts where we care about not clearing the higher lanes of// the FloatRegister.voidvmovss(constAddress&src,FloatRegisterdest){masm.vmovss_mr(src.offset,src.base.encoding(),dest.encoding());}voidvmovss(constBaseIndex&src,FloatRegisterdest){masm.vmovss_mr(src.offset,src.base.encoding(),src.index.encoding(),src.scale,dest.encoding());}voidvmovss(FloatRegistersrc,constAddress&dest){masm.vmovss_rm(src.encoding(),dest.offset,dest.base.encoding());}voidvmovss(FloatRegistersrc,constBaseIndex&dest){masm.vmovss_rm(src.encoding(),dest.offset,dest.base.encoding(),dest.index.encoding(),dest.scale);}voidvmovss(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){masm.vmovss_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvmovdqu(constOperand&src,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src.kind()){caseOperand::MEM_REG_DISP:masm.vmovdqu_mr(src.disp(),src.base(),dest.encoding());break;caseOperand::MEM_SCALE:masm.vmovdqu_mr(src.disp(),src.base(),src.index(),src.scale(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvmovdqu(FloatRegistersrc,constOperand&dest){MOZ_ASSERT(HasSSE2());switch(dest.kind()){caseOperand::MEM_REG_DISP:masm.vmovdqu_rm(src.encoding(),dest.disp(),dest.base());break;caseOperand::MEM_SCALE:masm.vmovdqu_rm(src.encoding(),dest.disp(),dest.base(),dest.index(),dest.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidvmovdqa(constOperand&src,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src.kind()){caseOperand::FPREG:masm.vmovdqa_rr(src.fpu(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vmovdqa_mr(src.disp(),src.base(),dest.encoding());break;caseOperand::MEM_SCALE:masm.vmovdqa_mr(src.disp(),src.base(),src.index(),src.scale(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvmovdqa(FloatRegistersrc,constOperand&dest){MOZ_ASSERT(HasSSE2());switch(dest.kind()){caseOperand::MEM_REG_DISP:masm.vmovdqa_rm(src.encoding(),dest.disp(),dest.base());break;caseOperand::MEM_SCALE:masm.vmovdqa_rm(src.encoding(),dest.disp(),dest.base(),dest.index(),dest.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidvmovdqa(FloatRegistersrc,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vmovdqa_rr(src.encoding(),dest.encoding());}voidvcvtss2sd(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vcvtss2sd_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvcvtsd2ss(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vcvtsd2ss_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidmovzbl(constOperand&src,Registerdest){switch(src.kind()){caseOperand::MEM_REG_DISP:masm.movzbl_mr(src.disp(),src.base(),dest.encoding());break;caseOperand::MEM_SCALE:masm.movzbl_mr(src.disp(),src.base(),src.index(),src.scale(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidmovsbl(Registersrc,Registerdest){masm.movsbl_rr(src.encoding(),dest.encoding());}voidmovsbl(constOperand&src,Registerdest){switch(src.kind()){caseOperand::MEM_REG_DISP:masm.movsbl_mr(src.disp(),src.base(),dest.encoding());break;caseOperand::MEM_SCALE:masm.movsbl_mr(src.disp(),src.base(),src.index(),src.scale(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidmovb(constOperand&src,Registerdest){switch(src.kind()){caseOperand::MEM_REG_DISP:masm.movb_mr(src.disp(),src.base(),dest.encoding());break;caseOperand::MEM_SCALE:masm.movb_mr(src.disp(),src.base(),src.index(),src.scale(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidmovb(Imm32src,Registerdest){masm.movb_ir(src.value&255,dest.encoding());}voidmovb(Registersrc,constOperand&dest){switch(dest.kind()){caseOperand::MEM_REG_DISP:masm.movb_rm(src.encoding(),dest.disp(),dest.base());break;caseOperand::MEM_SCALE:masm.movb_rm(src.encoding(),dest.disp(),dest.base(),dest.index(),dest.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidmovb(Imm32src,constOperand&dest){switch(dest.kind()){caseOperand::MEM_REG_DISP:masm.movb_im(src.value,dest.disp(),dest.base());break;caseOperand::MEM_SCALE:masm.movb_im(src.value,dest.disp(),dest.base(),dest.index(),dest.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidmovzwl(constOperand&src,Registerdest){switch(src.kind()){caseOperand::REG:masm.movzwl_rr(src.reg(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.movzwl_mr(src.disp(),src.base(),dest.encoding());break;caseOperand::MEM_SCALE:masm.movzwl_mr(src.disp(),src.base(),src.index(),src.scale(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidmovzwl(Registersrc,Registerdest){masm.movzwl_rr(src.encoding(),dest.encoding());}voidmovw(constOperand&src,Registerdest){masm.prefix_16_for_32();movl(src,dest);}voidmovw(Imm32src,Registerdest){masm.prefix_16_for_32();movl(src,dest);}voidmovw(Registersrc,constOperand&dest){switch(dest.kind()){caseOperand::MEM_REG_DISP:masm.movw_rm(src.encoding(),dest.disp(),dest.base());break;caseOperand::MEM_SCALE:masm.movw_rm(src.encoding(),dest.disp(),dest.base(),dest.index(),dest.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidmovw(Imm32src,constOperand&dest){switch(dest.kind()){caseOperand::MEM_REG_DISP:masm.movw_im(src.value,dest.disp(),dest.base());break;caseOperand::MEM_SCALE:masm.movw_im(src.value,dest.disp(),dest.base(),dest.index(),dest.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidmovswl(Registersrc,Registerdest){masm.movswl_rr(src.encoding(),dest.encoding());}voidmovswl(constOperand&src,Registerdest){switch(src.kind()){caseOperand::MEM_REG_DISP:masm.movswl_mr(src.disp(),src.base(),dest.encoding());break;caseOperand::MEM_SCALE:masm.movswl_mr(src.disp(),src.base(),src.index(),src.scale(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidleal(constOperand&src,Registerdest){switch(src.kind()){caseOperand::MEM_REG_DISP:masm.leal_mr(src.disp(),src.base(),dest.encoding());break;caseOperand::MEM_SCALE:masm.leal_mr(src.disp(),src.base(),src.index(),src.scale(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}protected:voidjSrc(Conditioncond,Label*label){if(label->bound()){// The jump can be immediately encoded to the correct destination.masm.jCC_i(static_cast<X86Encoding::Condition>(cond),JmpDst(label->offset()));}else{// Thread the jump list through the unpatched jump targets.JmpSrcj=masm.jCC(static_cast<X86Encoding::Condition>(cond));JmpSrcprev=JmpSrc(label->use(j.offset()));masm.setNextJump(j,prev);}}voidjmpSrc(Label*label){if(label->bound()){// The jump can be immediately encoded to the correct destination.masm.jmp_i(JmpDst(label->offset()));}else{// Thread the jump list through the unpatched jump targets.JmpSrcj=masm.jmp();JmpSrcprev=JmpSrc(label->use(j.offset()));masm.setNextJump(j,prev);}}// Comparison of EAX against the address given by a Label.JmpSrccmpSrc(Label*label){JmpSrcj=masm.cmp_eax();if(label->bound()){// The jump can be immediately patched to the correct destination.masm.linkJump(j,JmpDst(label->offset()));}else{// Thread the jump list through the unpatched jump targets.JmpSrcprev=JmpSrc(label->use(j.offset()));masm.setNextJump(j,prev);}returnj;}JmpSrcjSrc(Conditioncond,RepatchLabel*label){JmpSrcj=masm.jCC(static_cast<X86Encoding::Condition>(cond));if(label->bound()){// The jump can be immediately patched to the correct destination.masm.linkJump(j,JmpDst(label->offset()));}else{label->use(j.offset());}returnj;}JmpSrcjmpSrc(RepatchLabel*label){JmpSrcj=masm.jmp();if(label->bound()){// The jump can be immediately patched to the correct destination.masm.linkJump(j,JmpDst(label->offset()));}else{// Thread the jump list through the unpatched jump targets.label->use(j.offset());}returnj;}public:voidnop(){masm.nop();}voidnop(size_tn){masm.insert_nop(n);}voidj(Conditioncond,Label*label){jSrc(cond,label);}voidjmp(Label*label){jmpSrc(label);}voidj(Conditioncond,RepatchLabel*label){jSrc(cond,label);}voidjmp(RepatchLabel*label){jmpSrc(label);}voidj(Conditioncond,wasm::TrapDesctarget){Labell;j(cond,&l);bindLater(&l,target);}voidjmp(wasm::TrapDesctarget){Labell;jmp(&l);bindLater(&l,target);}voidjmp(constOperand&op){switch(op.kind()){caseOperand::MEM_REG_DISP:masm.jmp_m(op.disp(),op.base());break;caseOperand::MEM_SCALE:masm.jmp_m(op.disp(),op.base(),op.index(),op.scale());break;caseOperand::REG:masm.jmp_r(op.reg());break;default:MOZ_CRASH("unexpected operand kind");}}voidcmpEAX(Label*label){cmpSrc(label);}voidbind(Label*label){JmpDstdst(masm.label());if(label->used()){boolmore;JmpSrcjmp(label->offset());do{JmpSrcnext;more=masm.nextJump(jmp,&next);masm.linkJump(jmp,dst);jmp=next;}while(more);}label->bind(dst.offset());}voidbindLater(Label*label,wasm::TrapDesctarget){if(label->used()){JmpSrcjmp(label->offset());do{append(wasm::TrapSite(target,jmp.offset()));}while(masm.nextJump(jmp,&jmp));}label->reset();}voidbind(RepatchLabel*label){JmpDstdst(masm.label());if(label->used()){JmpSrcjmp(label->offset());masm.linkJump(jmp,dst);}label->bind(dst.offset());}voiduse(CodeOffset*label){label->bind(currentOffset());}uint32_tcurrentOffset(){returnmasm.label().offset();}// Re-routes pending jumps to a new label.voidretarget(Label*label,Label*target){if(!label->used())return;boolmore;JmpSrcjmp(label->offset());do{JmpSrcnext;more=masm.nextJump(jmp,&next);if(target->bound()){// The jump can be immediately patched to the correct destination.masm.linkJump(jmp,JmpDst(target->offset()));}else{// Thread the jump list through the unpatched jump targets.JmpSrcprev(target->use(jmp.offset()));masm.setNextJump(jmp,prev);}jmp=JmpSrc(next.offset());}while(more);label->reset();}staticvoidBind(uint8_t*raw,CodeOffset*label,constvoid*address){if(label->bound()){intptr_toffset=label->offset();X86Encoding::SetPointer(raw+offset,address);}}// See Bind and X86Encoding::setPointer.size_tlabelToPatchOffset(CodeOffsetlabel){returnlabel.offset()-sizeof(void*);}voidret(){masm.ret();}voidretn(Imm32n){// Remove the size of the return address which is included in the frame.masm.ret_i(n.value-sizeof(void*));}CodeOffsetcall(Label*label){if(label->bound()){masm.linkJump(masm.call(),JmpDst(label->offset()));}else{JmpSrcj=masm.call();JmpSrcprev=JmpSrc(label->use(j.offset()));masm.setNextJump(j,prev);}returnCodeOffset(masm.currentOffset());}CodeOffsetcall(Registerreg){masm.call_r(reg.encoding());returnCodeOffset(masm.currentOffset());}voidcall(constOperand&op){switch(op.kind()){caseOperand::REG:masm.call_r(op.reg());break;caseOperand::MEM_REG_DISP:masm.call_m(op.disp(),op.base());break;default:MOZ_CRASH("unexpected operand kind");}}CodeOffsetcallWithPatch(){returnCodeOffset(masm.call().offset());}voidpatchCall(uint32_tcallerOffset,uint32_tcalleeOffset){unsignedchar*code=masm.data();X86Encoding::SetRel32(code+callerOffset,code+calleeOffset);}CodeOffsetfarJumpWithPatch(){returnCodeOffset(masm.jmp().offset());}voidpatchFarJump(CodeOffsetfarJump,uint32_ttargetOffset){unsignedchar*code=masm.data();X86Encoding::SetRel32(code+farJump.offset(),code+targetOffset);}staticvoidrepatchFarJump(uint8_t*code,uint32_tfarJumpOffset,uint32_ttargetOffset){X86Encoding::SetRel32(code+farJumpOffset,code+targetOffset);}// This is for patching during code generation, not after.voidpatchAddl(CodeOffsetoffset,int32_tn){unsignedchar*code=masm.data();X86Encoding::SetInt32(code+offset.offset(),n);}CodeOffsettwoByteNop(){returnCodeOffset(masm.twoByteNop().offset());}staticvoidpatchTwoByteNopToJump(uint8_t*jump,uint8_t*target){X86Encoding::BaseAssembler::patchTwoByteNopToJump(jump,target);}staticvoidpatchJumpToTwoByteNop(uint8_t*jump){X86Encoding::BaseAssembler::patchJumpToTwoByteNop(jump);}staticvoidpatchFiveByteNopToCall(uint8_t*callsite,uint8_t*target){X86Encoding::BaseAssembler::patchFiveByteNopToCall(callsite,target);}staticvoidpatchCallToFiveByteNop(uint8_t*callsite){X86Encoding::BaseAssembler::patchCallToFiveByteNop(callsite);}voidbreakpoint(){masm.int3();}staticboolHasSSE2(){returnCPUInfo::IsSSE2Present();}staticboolHasSSE3(){returnCPUInfo::IsSSE3Present();}staticboolHasSSSE3(){returnCPUInfo::IsSSSE3Present();}staticboolHasSSE41(){returnCPUInfo::IsSSE41Present();}staticboolHasPOPCNT(){returnCPUInfo::IsPOPCNTPresent();}staticboolSupportsFloatingPoint(){returnCPUInfo::IsSSE2Present();}staticboolSupportsUnalignedAccesses(){returntrue;}staticboolSupportsSimd(){returnCPUInfo::IsSSE2Present();}staticboolHasAVX(){returnCPUInfo::IsAVXPresent();}staticboolHasRoundInstruction(RoundingModemode){switch(mode){caseRoundingMode::Up:caseRoundingMode::Down:caseRoundingMode::NearestTiesToEven:caseRoundingMode::TowardsZero:returnCPUInfo::IsSSE41Present();}MOZ_CRASH("unexpected mode");}voidcmpl(Registerrhs,Registerlhs){masm.cmpl_rr(rhs.encoding(),lhs.encoding());}voidcmpl(constOperand&rhs,Registerlhs){switch(rhs.kind()){caseOperand::REG:masm.cmpl_rr(rhs.reg(),lhs.encoding());break;caseOperand::MEM_REG_DISP:masm.cmpl_mr(rhs.disp(),rhs.base(),lhs.encoding());break;caseOperand::MEM_ADDRESS32:masm.cmpl_mr(rhs.address(),lhs.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidcmpl(Registerrhs,constOperand&lhs){switch(lhs.kind()){caseOperand::REG:masm.cmpl_rr(rhs.encoding(),lhs.reg());break;caseOperand::MEM_REG_DISP:masm.cmpl_rm(rhs.encoding(),lhs.disp(),lhs.base());break;caseOperand::MEM_ADDRESS32:masm.cmpl_rm(rhs.encoding(),lhs.address());break;default:MOZ_CRASH("unexpected operand kind");}}voidcmpl(Imm32rhs,Registerlhs){masm.cmpl_ir(rhs.value,lhs.encoding());}voidcmpl(Imm32rhs,constOperand&lhs){switch(lhs.kind()){caseOperand::REG:masm.cmpl_ir(rhs.value,lhs.reg());break;caseOperand::MEM_REG_DISP:masm.cmpl_im(rhs.value,lhs.disp(),lhs.base());break;caseOperand::MEM_SCALE:masm.cmpl_im(rhs.value,lhs.disp(),lhs.base(),lhs.index(),lhs.scale());break;caseOperand::MEM_ADDRESS32:masm.cmpl_im(rhs.value,lhs.address());break;default:MOZ_CRASH("unexpected operand kind");}}CodeOffsetcmplWithPatch(Imm32rhs,Registerlhs){masm.cmpl_i32r(rhs.value,lhs.encoding());returnCodeOffset(masm.currentOffset());}voidcmpw(Registerrhs,Registerlhs){masm.cmpw_rr(rhs.encoding(),lhs.encoding());}voidsetCC(Conditioncond,Registerr){masm.setCC_r(static_cast<X86Encoding::Condition>(cond),r.encoding());}voidtestb(Registerrhs,Registerlhs){MOZ_ASSERT(AllocatableGeneralRegisterSet(Registers::SingleByteRegs).has(rhs));MOZ_ASSERT(AllocatableGeneralRegisterSet(Registers::SingleByteRegs).has(lhs));masm.testb_rr(rhs.encoding(),lhs.encoding());}voidtestw(Registerrhs,Registerlhs){masm.testw_rr(lhs.encoding(),rhs.encoding());}voidtestl(Registerrhs,Registerlhs){masm.testl_rr(lhs.encoding(),rhs.encoding());}voidtestl(Imm32rhs,Registerlhs){masm.testl_ir(rhs.value,lhs.encoding());}voidtestl(Imm32rhs,constOperand&lhs){switch(lhs.kind()){caseOperand::REG:masm.testl_ir(rhs.value,lhs.reg());break;caseOperand::MEM_REG_DISP:masm.testl_i32m(rhs.value,lhs.disp(),lhs.base());break;caseOperand::MEM_ADDRESS32:masm.testl_i32m(rhs.value,lhs.address());break;default:MOZ_CRASH("unexpected operand kind");break;}}voidaddl(Imm32imm,Registerdest){masm.addl_ir(imm.value,dest.encoding());}CodeOffsetaddlWithPatch(Imm32imm,Registerdest){masm.addl_i32r(imm.value,dest.encoding());returnCodeOffset(masm.currentOffset());}voidaddl(Imm32imm,constOperand&op){switch(op.kind()){caseOperand::REG:masm.addl_ir(imm.value,op.reg());break;caseOperand::MEM_REG_DISP:masm.addl_im(imm.value,op.disp(),op.base());break;caseOperand::MEM_ADDRESS32:masm.addl_im(imm.value,op.address());break;caseOperand::MEM_SCALE:masm.addl_im(imm.value,op.disp(),op.base(),op.index(),op.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidaddw(Imm32imm,constOperand&op){switch(op.kind()){caseOperand::REG:masm.addw_ir(imm.value,op.reg());break;caseOperand::MEM_REG_DISP:masm.addw_im(imm.value,op.disp(),op.base());break;caseOperand::MEM_ADDRESS32:masm.addw_im(imm.value,op.address());break;caseOperand::MEM_SCALE:masm.addw_im(imm.value,op.disp(),op.base(),op.index(),op.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidsubl(Imm32imm,Registerdest){masm.subl_ir(imm.value,dest.encoding());}voidsubl(Imm32imm,constOperand&op){switch(op.kind()){caseOperand::REG:masm.subl_ir(imm.value,op.reg());break;caseOperand::MEM_REG_DISP:masm.subl_im(imm.value,op.disp(),op.base());break;caseOperand::MEM_SCALE:masm.subl_im(imm.value,op.disp(),op.base(),op.index(),op.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidsubw(Imm32imm,constOperand&op){switch(op.kind()){caseOperand::REG:masm.subw_ir(imm.value,op.reg());break;caseOperand::MEM_REG_DISP:masm.subw_im(imm.value,op.disp(),op.base());break;caseOperand::MEM_SCALE:masm.subw_im(imm.value,op.disp(),op.base(),op.index(),op.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidaddl(Registersrc,Registerdest){masm.addl_rr(src.encoding(),dest.encoding());}voidaddl(Registersrc,constOperand&dest){switch(dest.kind()){caseOperand::REG:masm.addl_rr(src.encoding(),dest.reg());break;caseOperand::MEM_REG_DISP:masm.addl_rm(src.encoding(),dest.disp(),dest.base());break;caseOperand::MEM_SCALE:masm.addl_rm(src.encoding(),dest.disp(),dest.base(),dest.index(),dest.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidaddw(Registersrc,constOperand&dest){switch(dest.kind()){caseOperand::REG:masm.addw_rr(src.encoding(),dest.reg());break;caseOperand::MEM_REG_DISP:masm.addw_rm(src.encoding(),dest.disp(),dest.base());break;caseOperand::MEM_SCALE:masm.addw_rm(src.encoding(),dest.disp(),dest.base(),dest.index(),dest.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidsubl(Registersrc,Registerdest){masm.subl_rr(src.encoding(),dest.encoding());}voidsubl(constOperand&src,Registerdest){switch(src.kind()){caseOperand::REG:masm.subl_rr(src.reg(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.subl_mr(src.disp(),src.base(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidsubl(Registersrc,constOperand&dest){switch(dest.kind()){caseOperand::REG:masm.subl_rr(src.encoding(),dest.reg());break;caseOperand::MEM_REG_DISP:masm.subl_rm(src.encoding(),dest.disp(),dest.base());break;caseOperand::MEM_SCALE:masm.subl_rm(src.encoding(),dest.disp(),dest.base(),dest.index(),dest.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidsubw(Registersrc,constOperand&dest){switch(dest.kind()){caseOperand::REG:masm.subw_rr(src.encoding(),dest.reg());break;caseOperand::MEM_REG_DISP:masm.subw_rm(src.encoding(),dest.disp(),dest.base());break;caseOperand::MEM_SCALE:masm.subw_rm(src.encoding(),dest.disp(),dest.base(),dest.index(),dest.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidorl(Registerreg,Registerdest){masm.orl_rr(reg.encoding(),dest.encoding());}voidorl(Registersrc,constOperand&dest){switch(dest.kind()){caseOperand::REG:masm.orl_rr(src.encoding(),dest.reg());break;caseOperand::MEM_REG_DISP:masm.orl_rm(src.encoding(),dest.disp(),dest.base());break;caseOperand::MEM_SCALE:masm.orl_rm(src.encoding(),dest.disp(),dest.base(),dest.index(),dest.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidorw(Registersrc,constOperand&dest){switch(dest.kind()){caseOperand::REG:masm.orw_rr(src.encoding(),dest.reg());break;caseOperand::MEM_REG_DISP:masm.orw_rm(src.encoding(),dest.disp(),dest.base());break;caseOperand::MEM_SCALE:masm.orw_rm(src.encoding(),dest.disp(),dest.base(),dest.index(),dest.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidorl(Imm32imm,Registerreg){masm.orl_ir(imm.value,reg.encoding());}voidorl(Imm32imm,constOperand&op){switch(op.kind()){caseOperand::REG:masm.orl_ir(imm.value,op.reg());break;caseOperand::MEM_REG_DISP:masm.orl_im(imm.value,op.disp(),op.base());break;caseOperand::MEM_SCALE:masm.orl_im(imm.value,op.disp(),op.base(),op.index(),op.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidorw(Imm32imm,constOperand&op){switch(op.kind()){caseOperand::REG:masm.orw_ir(imm.value,op.reg());break;caseOperand::MEM_REG_DISP:masm.orw_im(imm.value,op.disp(),op.base());break;caseOperand::MEM_SCALE:masm.orw_im(imm.value,op.disp(),op.base(),op.index(),op.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidxorl(Registersrc,Registerdest){masm.xorl_rr(src.encoding(),dest.encoding());}voidxorl(Registersrc,constOperand&dest){switch(dest.kind()){caseOperand::REG:masm.xorl_rr(src.encoding(),dest.reg());break;caseOperand::MEM_REG_DISP:masm.xorl_rm(src.encoding(),dest.disp(),dest.base());break;caseOperand::MEM_SCALE:masm.xorl_rm(src.encoding(),dest.disp(),dest.base(),dest.index(),dest.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidxorw(Registersrc,constOperand&dest){switch(dest.kind()){caseOperand::REG:masm.xorw_rr(src.encoding(),dest.reg());break;caseOperand::MEM_REG_DISP:masm.xorw_rm(src.encoding(),dest.disp(),dest.base());break;caseOperand::MEM_SCALE:masm.xorw_rm(src.encoding(),dest.disp(),dest.base(),dest.index(),dest.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidxorl(Imm32imm,Registerreg){masm.xorl_ir(imm.value,reg.encoding());}voidxorl(Imm32imm,constOperand&op){switch(op.kind()){caseOperand::REG:masm.xorl_ir(imm.value,op.reg());break;caseOperand::MEM_REG_DISP:masm.xorl_im(imm.value,op.disp(),op.base());break;caseOperand::MEM_SCALE:masm.xorl_im(imm.value,op.disp(),op.base(),op.index(),op.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidxorw(Imm32imm,constOperand&op){switch(op.kind()){caseOperand::REG:masm.xorw_ir(imm.value,op.reg());break;caseOperand::MEM_REG_DISP:masm.xorw_im(imm.value,op.disp(),op.base());break;caseOperand::MEM_SCALE:masm.xorw_im(imm.value,op.disp(),op.base(),op.index(),op.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidandl(Registersrc,Registerdest){masm.andl_rr(src.encoding(),dest.encoding());}voidandl(Registersrc,constOperand&dest){switch(dest.kind()){caseOperand::REG:masm.andl_rr(src.encoding(),dest.reg());break;caseOperand::MEM_REG_DISP:masm.andl_rm(src.encoding(),dest.disp(),dest.base());break;caseOperand::MEM_SCALE:masm.andl_rm(src.encoding(),dest.disp(),dest.base(),dest.index(),dest.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidandw(Registersrc,constOperand&dest){switch(dest.kind()){caseOperand::REG:masm.andw_rr(src.encoding(),dest.reg());break;caseOperand::MEM_REG_DISP:masm.andw_rm(src.encoding(),dest.disp(),dest.base());break;caseOperand::MEM_SCALE:masm.andw_rm(src.encoding(),dest.disp(),dest.base(),dest.index(),dest.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidandl(Imm32imm,Registerdest){masm.andl_ir(imm.value,dest.encoding());}voidandl(Imm32imm,constOperand&op){switch(op.kind()){caseOperand::REG:masm.andl_ir(imm.value,op.reg());break;caseOperand::MEM_REG_DISP:masm.andl_im(imm.value,op.disp(),op.base());break;caseOperand::MEM_SCALE:masm.andl_im(imm.value,op.disp(),op.base(),op.index(),op.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidandw(Imm32imm,constOperand&op){switch(op.kind()){caseOperand::REG:masm.andw_ir(imm.value,op.reg());break;caseOperand::MEM_REG_DISP:masm.andw_im(imm.value,op.disp(),op.base());break;caseOperand::MEM_SCALE:masm.andw_im(imm.value,op.disp(),op.base(),op.index(),op.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidaddl(constOperand&src,Registerdest){switch(src.kind()){caseOperand::REG:masm.addl_rr(src.reg(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.addl_mr(src.disp(),src.base(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidorl(constOperand&src,Registerdest){switch(src.kind()){caseOperand::REG:masm.orl_rr(src.reg(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.orl_mr(src.disp(),src.base(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidxorl(constOperand&src,Registerdest){switch(src.kind()){caseOperand::REG:masm.xorl_rr(src.reg(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.xorl_mr(src.disp(),src.base(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidandl(constOperand&src,Registerdest){switch(src.kind()){caseOperand::REG:masm.andl_rr(src.reg(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.andl_mr(src.disp(),src.base(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidbsrl(constRegister&src,constRegister&dest){masm.bsrl_rr(src.encoding(),dest.encoding());}voidbsfl(constRegister&src,constRegister&dest){masm.bsfl_rr(src.encoding(),dest.encoding());}voidpopcntl(constRegister&src,constRegister&dest){masm.popcntl_rr(src.encoding(),dest.encoding());}voidimull(Registermultiplier){masm.imull_r(multiplier.encoding());}voidumull(Registermultiplier){masm.mull_r(multiplier.encoding());}voidimull(Imm32imm,Registerdest){masm.imull_ir(imm.value,dest.encoding(),dest.encoding());}voidimull(Registersrc,Registerdest){masm.imull_rr(src.encoding(),dest.encoding());}voidimull(Imm32imm,Registersrc,Registerdest){masm.imull_ir(imm.value,src.encoding(),dest.encoding());}voidimull(constOperand&src,Registerdest){switch(src.kind()){caseOperand::REG:masm.imull_rr(src.reg(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.imull_mr(src.disp(),src.base(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidnegl(constOperand&src){switch(src.kind()){caseOperand::REG:masm.negl_r(src.reg());break;caseOperand::MEM_REG_DISP:masm.negl_m(src.disp(),src.base());break;default:MOZ_CRASH("unexpected operand kind");}}voidnegl(Registerreg){masm.negl_r(reg.encoding());}voidnotl(constOperand&src){switch(src.kind()){caseOperand::REG:masm.notl_r(src.reg());break;caseOperand::MEM_REG_DISP:masm.notl_m(src.disp(),src.base());break;default:MOZ_CRASH("unexpected operand kind");}}voidnotl(Registerreg){masm.notl_r(reg.encoding());}voidshrl(constImm32imm,Registerdest){masm.shrl_ir(imm.value,dest.encoding());}voidshll(constImm32imm,Registerdest){masm.shll_ir(imm.value,dest.encoding());}voidsarl(constImm32imm,Registerdest){masm.sarl_ir(imm.value,dest.encoding());}voidshrl_cl(Registerdest){masm.shrl_CLr(dest.encoding());}voidshll_cl(Registerdest){masm.shll_CLr(dest.encoding());}voidsarl_cl(Registerdest){masm.sarl_CLr(dest.encoding());}voidshrdl_cl(Registersrc,Registerdest){masm.shrdl_CLr(src.encoding(),dest.encoding());}voidshldl_cl(Registersrc,Registerdest){masm.shldl_CLr(src.encoding(),dest.encoding());}voidroll(constImm32imm,Registerdest){masm.roll_ir(imm.value,dest.encoding());}voidroll_cl(Registerdest){masm.roll_CLr(dest.encoding());}voidrorl(constImm32imm,Registerdest){masm.rorl_ir(imm.value,dest.encoding());}voidrorl_cl(Registerdest){masm.rorl_CLr(dest.encoding());}voidincl(constOperand&op){switch(op.kind()){caseOperand::MEM_REG_DISP:masm.incl_m32(op.disp(),op.base());break;default:MOZ_CRASH("unexpected operand kind");}}voidlock_incl(constOperand&op){masm.prefix_lock();incl(op);}voiddecl(constOperand&op){switch(op.kind()){caseOperand::MEM_REG_DISP:masm.decl_m32(op.disp(),op.base());break;default:MOZ_CRASH("unexpected operand kind");}}voidlock_decl(constOperand&op){masm.prefix_lock();decl(op);}voidaddb(Imm32imm,constOperand&op){switch(op.kind()){caseOperand::MEM_REG_DISP:masm.addb_im(imm.value,op.disp(),op.base());break;caseOperand::MEM_SCALE:masm.addb_im(imm.value,op.disp(),op.base(),op.index(),op.scale());break;default:MOZ_CRASH("unexpected operand kind");break;}}voidaddb(Registersrc,constOperand&op){switch(op.kind()){caseOperand::MEM_REG_DISP:masm.addb_rm(src.encoding(),op.disp(),op.base());break;caseOperand::MEM_SCALE:masm.addb_rm(src.encoding(),op.disp(),op.base(),op.index(),op.scale());break;default:MOZ_CRASH("unexpected operand kind");break;}}voidsubb(Imm32imm,constOperand&op){switch(op.kind()){caseOperand::MEM_REG_DISP:masm.subb_im(imm.value,op.disp(),op.base());break;caseOperand::MEM_SCALE:masm.subb_im(imm.value,op.disp(),op.base(),op.index(),op.scale());break;default:MOZ_CRASH("unexpected operand kind");break;}}voidsubb(Registersrc,constOperand&op){switch(op.kind()){caseOperand::MEM_REG_DISP:masm.subb_rm(src.encoding(),op.disp(),op.base());break;caseOperand::MEM_SCALE:masm.subb_rm(src.encoding(),op.disp(),op.base(),op.index(),op.scale());break;default:MOZ_CRASH("unexpected operand kind");break;}}voidandb(Imm32imm,constOperand&op){switch(op.kind()){caseOperand::MEM_REG_DISP:masm.andb_im(imm.value,op.disp(),op.base());break;caseOperand::MEM_SCALE:masm.andb_im(imm.value,op.disp(),op.base(),op.index(),op.scale());break;default:MOZ_CRASH("unexpected operand kind");break;}}voidandb(Registersrc,constOperand&op){switch(op.kind()){caseOperand::MEM_REG_DISP:masm.andb_rm(src.encoding(),op.disp(),op.base());break;caseOperand::MEM_SCALE:masm.andb_rm(src.encoding(),op.disp(),op.base(),op.index(),op.scale());break;default:MOZ_CRASH("unexpected operand kind");break;}}voidorb(Imm32imm,constOperand&op){switch(op.kind()){caseOperand::MEM_REG_DISP:masm.orb_im(imm.value,op.disp(),op.base());break;caseOperand::MEM_SCALE:masm.orb_im(imm.value,op.disp(),op.base(),op.index(),op.scale());break;default:MOZ_CRASH("unexpected operand kind");break;}}voidorb(Registersrc,constOperand&op){switch(op.kind()){caseOperand::MEM_REG_DISP:masm.orb_rm(src.encoding(),op.disp(),op.base());break;caseOperand::MEM_SCALE:masm.orb_rm(src.encoding(),op.disp(),op.base(),op.index(),op.scale());break;default:MOZ_CRASH("unexpected operand kind");break;}}voidxorb(Imm32imm,constOperand&op){switch(op.kind()){caseOperand::MEM_REG_DISP:masm.xorb_im(imm.value,op.disp(),op.base());break;caseOperand::MEM_SCALE:masm.xorb_im(imm.value,op.disp(),op.base(),op.index(),op.scale());break;default:MOZ_CRASH("unexpected operand kind");break;}}voidxorb(Registersrc,constOperand&op){switch(op.kind()){caseOperand::MEM_REG_DISP:masm.xorb_rm(src.encoding(),op.disp(),op.base());break;caseOperand::MEM_SCALE:masm.xorb_rm(src.encoding(),op.disp(),op.base(),op.index(),op.scale());break;default:MOZ_CRASH("unexpected operand kind");break;}}template<typenameT>voidlock_addb(Tsrc,constOperand&op){masm.prefix_lock();addb(src,op);}template<typenameT>voidlock_subb(Tsrc,constOperand&op){masm.prefix_lock();subb(src,op);}template<typenameT>voidlock_andb(Tsrc,constOperand&op){masm.prefix_lock();andb(src,op);}template<typenameT>voidlock_orb(Tsrc,constOperand&op){masm.prefix_lock();orb(src,op);}template<typenameT>voidlock_xorb(Tsrc,constOperand&op){masm.prefix_lock();xorb(src,op);}template<typenameT>voidlock_addw(Tsrc,constOperand&op){masm.prefix_lock();addw(src,op);}template<typenameT>voidlock_subw(Tsrc,constOperand&op){masm.prefix_lock();subw(src,op);}template<typenameT>voidlock_andw(Tsrc,constOperand&op){masm.prefix_lock();andw(src,op);}template<typenameT>voidlock_orw(Tsrc,constOperand&op){masm.prefix_lock();orw(src,op);}template<typenameT>voidlock_xorw(Tsrc,constOperand&op){masm.prefix_lock();xorw(src,op);}// Note, lock_addl(imm, op) is used for a memory barrier on non-SSE2 systems,// among other things. Do not optimize, replace by XADDL, or similar.template<typenameT>voidlock_addl(Tsrc,constOperand&op){masm.prefix_lock();addl(src,op);}template<typenameT>voidlock_subl(Tsrc,constOperand&op){masm.prefix_lock();subl(src,op);}template<typenameT>voidlock_andl(Tsrc,constOperand&op){masm.prefix_lock();andl(src,op);}template<typenameT>voidlock_orl(Tsrc,constOperand&op){masm.prefix_lock();orl(src,op);}template<typenameT>voidlock_xorl(Tsrc,constOperand&op){masm.prefix_lock();xorl(src,op);}voidlock_cmpxchgb(Registersrc,constOperand&mem){masm.prefix_lock();switch(mem.kind()){caseOperand::MEM_REG_DISP:masm.cmpxchgb(src.encoding(),mem.disp(),mem.base());break;caseOperand::MEM_SCALE:masm.cmpxchgb(src.encoding(),mem.disp(),mem.base(),mem.index(),mem.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidlock_cmpxchgw(Registersrc,constOperand&mem){masm.prefix_lock();switch(mem.kind()){caseOperand::MEM_REG_DISP:masm.cmpxchgw(src.encoding(),mem.disp(),mem.base());break;caseOperand::MEM_SCALE:masm.cmpxchgw(src.encoding(),mem.disp(),mem.base(),mem.index(),mem.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidlock_cmpxchgl(Registersrc,constOperand&mem){masm.prefix_lock();switch(mem.kind()){caseOperand::MEM_REG_DISP:masm.cmpxchgl(src.encoding(),mem.disp(),mem.base());break;caseOperand::MEM_SCALE:masm.cmpxchgl(src.encoding(),mem.disp(),mem.base(),mem.index(),mem.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidxchgb(Registersrc,constOperand&mem){switch(mem.kind()){caseOperand::MEM_REG_DISP:masm.xchgb_rm(src.encoding(),mem.disp(),mem.base());break;caseOperand::MEM_SCALE:masm.xchgb_rm(src.encoding(),mem.disp(),mem.base(),mem.index(),mem.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidxchgw(Registersrc,constOperand&mem){switch(mem.kind()){caseOperand::MEM_REG_DISP:masm.xchgw_rm(src.encoding(),mem.disp(),mem.base());break;caseOperand::MEM_SCALE:masm.xchgw_rm(src.encoding(),mem.disp(),mem.base(),mem.index(),mem.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidxchgl(Registersrc,constOperand&mem){switch(mem.kind()){caseOperand::MEM_REG_DISP:masm.xchgl_rm(src.encoding(),mem.disp(),mem.base());break;caseOperand::MEM_SCALE:masm.xchgl_rm(src.encoding(),mem.disp(),mem.base(),mem.index(),mem.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidlock_xaddb(Registersrcdest,constOperand&mem){switch(mem.kind()){caseOperand::MEM_REG_DISP:masm.lock_xaddb_rm(srcdest.encoding(),mem.disp(),mem.base());break;caseOperand::MEM_SCALE:masm.lock_xaddb_rm(srcdest.encoding(),mem.disp(),mem.base(),mem.index(),mem.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidlock_xaddw(Registersrcdest,constOperand&mem){masm.prefix_16_for_32();lock_xaddl(srcdest,mem);}voidlock_xaddl(Registersrcdest,constOperand&mem){switch(mem.kind()){caseOperand::MEM_REG_DISP:masm.lock_xaddl_rm(srcdest.encoding(),mem.disp(),mem.base());break;caseOperand::MEM_SCALE:masm.lock_xaddl_rm(srcdest.encoding(),mem.disp(),mem.base(),mem.index(),mem.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidpush(constImm32imm){masm.push_i(imm.value);}voidpush(constOperand&src){switch(src.kind()){caseOperand::REG:masm.push_r(src.reg());break;caseOperand::MEM_REG_DISP:masm.push_m(src.disp(),src.base());break;default:MOZ_CRASH("unexpected operand kind");}}voidpush(Registersrc){masm.push_r(src.encoding());}voidpush(constAddress&src){masm.push_m(src.offset,src.base.encoding());}voidpop(constOperand&src){switch(src.kind()){caseOperand::REG:masm.pop_r(src.reg());break;caseOperand::MEM_REG_DISP:masm.pop_m(src.disp(),src.base());break;default:MOZ_CRASH("unexpected operand kind");}}voidpop(Registersrc){masm.pop_r(src.encoding());}voidpop(constAddress&src){masm.pop_m(src.offset,src.base.encoding());}voidpushFlags(){masm.push_flags();}voidpopFlags(){masm.pop_flags();}#ifdef JS_CODEGEN_X86voidpushAllRegs(){masm.pusha();}voidpopAllRegs(){masm.popa();}#endif// Zero-extend byte to 32-bit integer.voidmovzbl(Registersrc,Registerdest){masm.movzbl_rr(src.encoding(),dest.encoding());}voidcdq(){masm.cdq();}voididiv(Registerdivisor){masm.idivl_r(divisor.encoding());}voidudiv(Registerdivisor){masm.divl_r(divisor.encoding());}voidvpinsrb(unsignedlane,Registersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE41());masm.vpinsrb_irr(lane,src1.encoding(),src0.encoding(),dest.encoding());}voidvpinsrw(unsignedlane,Registersrc1,FloatRegistersrc0,FloatRegisterdest){masm.vpinsrw_irr(lane,src1.encoding(),src0.encoding(),dest.encoding());}voidvpinsrd(unsignedlane,Registersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE41());masm.vpinsrd_irr(lane,src1.encoding(),src0.encoding(),dest.encoding());}voidvpextrb(unsignedlane,FloatRegistersrc,Registerdest){MOZ_ASSERT(HasSSE41());masm.vpextrb_irr(lane,src.encoding(),dest.encoding());}voidvpextrw(unsignedlane,FloatRegistersrc,Registerdest){masm.vpextrw_irr(lane,src.encoding(),dest.encoding());}voidvpextrd(unsignedlane,FloatRegistersrc,Registerdest){MOZ_ASSERT(HasSSE41());masm.vpextrd_irr(lane,src.encoding(),dest.encoding());}voidvpsrldq(Imm32shift,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vpsrldq_ir(shift.value,src0.encoding(),dest.encoding());}voidvpsllq(Imm32shift,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vpsllq_ir(shift.value,src0.encoding(),dest.encoding());}voidvpsrlq(Imm32shift,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vpsrlq_ir(shift.value,src0.encoding(),dest.encoding());}voidvpslld(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vpslld_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvpslld(Imm32count,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vpslld_ir(count.value,src0.encoding(),dest.encoding());}voidvpsrad(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vpsrad_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvpsrad(Imm32count,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vpsrad_ir(count.value,src0.encoding(),dest.encoding());}voidvpsrld(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vpsrld_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvpsrld(Imm32count,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vpsrld_ir(count.value,src0.encoding(),dest.encoding());}voidvpsllw(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vpsllw_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvpsllw(Imm32count,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vpsllw_ir(count.value,src0.encoding(),dest.encoding());}voidvpsraw(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vpsraw_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvpsraw(Imm32count,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vpsraw_ir(count.value,src0.encoding(),dest.encoding());}voidvpsrlw(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vpsrlw_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvpsrlw(Imm32count,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vpsrlw_ir(count.value,src0.encoding(),dest.encoding());}voidvcvtsi2sd(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::REG:masm.vcvtsi2sd_rr(src1.reg(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vcvtsi2sd_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_SCALE:masm.vcvtsi2sd_mr(src1.disp(),src1.base(),src1.index(),src1.scale(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvcvttsd2si(FloatRegistersrc,Registerdest){MOZ_ASSERT(HasSSE2());masm.vcvttsd2si_rr(src.encoding(),dest.encoding());}voidvcvttss2si(FloatRegistersrc,Registerdest){MOZ_ASSERT(HasSSE2());masm.vcvttss2si_rr(src.encoding(),dest.encoding());}voidvcvtsi2ss(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::REG:masm.vcvtsi2ss_rr(src1.reg(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vcvtsi2ss_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_SCALE:masm.vcvtsi2ss_mr(src1.disp(),src1.base(),src1.index(),src1.scale(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvcvtsi2ss(Registersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vcvtsi2ss_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvcvtsi2sd(Registersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vcvtsi2sd_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvcvttps2dq(FloatRegistersrc,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vcvttps2dq_rr(src.encoding(),dest.encoding());}voidvcvtdq2ps(FloatRegistersrc,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vcvtdq2ps_rr(src.encoding(),dest.encoding());}voidvmovmskpd(FloatRegistersrc,Registerdest){MOZ_ASSERT(HasSSE2());masm.vmovmskpd_rr(src.encoding(),dest.encoding());}voidvmovmskps(FloatRegistersrc,Registerdest){MOZ_ASSERT(HasSSE2());masm.vmovmskps_rr(src.encoding(),dest.encoding());}voidvpmovmskb(FloatRegistersrc,Registerdest){MOZ_ASSERT(HasSSE2());masm.vpmovmskb_rr(src.encoding(),dest.encoding());}voidvptest(FloatRegisterrhs,FloatRegisterlhs){MOZ_ASSERT(HasSSE41());masm.vptest_rr(rhs.encoding(),lhs.encoding());}voidvucomisd(FloatRegisterrhs,FloatRegisterlhs){MOZ_ASSERT(HasSSE2());masm.vucomisd_rr(rhs.encoding(),lhs.encoding());}voidvucomiss(FloatRegisterrhs,FloatRegisterlhs){MOZ_ASSERT(HasSSE2());masm.vucomiss_rr(rhs.encoding(),lhs.encoding());}voidvpcmpeqb(constOperand&rhs,FloatRegisterlhs,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(rhs.kind()){caseOperand::FPREG:masm.vpcmpeqb_rr(rhs.fpu(),lhs.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vpcmpeqb_mr(rhs.disp(),rhs.base(),lhs.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vpcmpeqb_mr(rhs.address(),lhs.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvpcmpgtb(constOperand&rhs,FloatRegisterlhs,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(rhs.kind()){caseOperand::FPREG:masm.vpcmpgtb_rr(rhs.fpu(),lhs.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vpcmpgtb_mr(rhs.disp(),rhs.base(),lhs.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vpcmpgtb_mr(rhs.address(),lhs.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvpcmpeqw(constOperand&rhs,FloatRegisterlhs,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(rhs.kind()){caseOperand::FPREG:masm.vpcmpeqw_rr(rhs.fpu(),lhs.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vpcmpeqw_mr(rhs.disp(),rhs.base(),lhs.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vpcmpeqw_mr(rhs.address(),lhs.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvpcmpgtw(constOperand&rhs,FloatRegisterlhs,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(rhs.kind()){caseOperand::FPREG:masm.vpcmpgtw_rr(rhs.fpu(),lhs.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vpcmpgtw_mr(rhs.disp(),rhs.base(),lhs.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vpcmpgtw_mr(rhs.address(),lhs.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvpcmpeqd(constOperand&rhs,FloatRegisterlhs,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(rhs.kind()){caseOperand::FPREG:masm.vpcmpeqd_rr(rhs.fpu(),lhs.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vpcmpeqd_mr(rhs.disp(),rhs.base(),lhs.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vpcmpeqd_mr(rhs.address(),lhs.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvpcmpgtd(constOperand&rhs,FloatRegisterlhs,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(rhs.kind()){caseOperand::FPREG:masm.vpcmpgtd_rr(rhs.fpu(),lhs.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vpcmpgtd_mr(rhs.disp(),rhs.base(),lhs.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vpcmpgtd_mr(rhs.address(),lhs.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvcmpps(uint8_torder,Operandsrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());// :TODO: (Bug 1132894) See LIRGeneratorX86Shared::lowerForFPU// FIXME: This logic belongs in the MacroAssembler.if(!HasAVX()&&!src0.aliases(dest)){if(src1.kind()==Operand::FPREG&&dest.aliases(FloatRegister::FromCode(src1.fpu()))){vmovdqa(src1,ScratchSimd128Reg);src1=Operand(ScratchSimd128Reg);}vmovdqa(src0,dest);src0=dest;}switch(src1.kind()){caseOperand::FPREG:masm.vcmpps_rr(order,src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vcmpps_mr(order,src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vcmpps_mr(order,src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvcmpeqps(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){vcmpps(X86Encoding::ConditionCmp_EQ,src1,src0,dest);}voidvcmpltps(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){vcmpps(X86Encoding::ConditionCmp_LT,src1,src0,dest);}voidvcmpleps(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){vcmpps(X86Encoding::ConditionCmp_LE,src1,src0,dest);}voidvcmpunordps(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){vcmpps(X86Encoding::ConditionCmp_UNORD,src1,src0,dest);}voidvcmpneqps(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){vcmpps(X86Encoding::ConditionCmp_NEQ,src1,src0,dest);}voidvcmpordps(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){vcmpps(X86Encoding::ConditionCmp_ORD,src1,src0,dest);}voidvrcpps(constOperand&src,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src.kind()){caseOperand::FPREG:masm.vrcpps_rr(src.fpu(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vrcpps_mr(src.disp(),src.base(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vrcpps_mr(src.address(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvsqrtps(constOperand&src,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src.kind()){caseOperand::FPREG:masm.vsqrtps_rr(src.fpu(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vsqrtps_mr(src.disp(),src.base(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vsqrtps_mr(src.address(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvrsqrtps(constOperand&src,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src.kind()){caseOperand::FPREG:masm.vrsqrtps_rr(src.fpu(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vrsqrtps_mr(src.disp(),src.base(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vrsqrtps_mr(src.address(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvmovd(Registersrc,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vmovd_rr(src.encoding(),dest.encoding());}voidvmovd(FloatRegistersrc,Registerdest){MOZ_ASSERT(HasSSE2());masm.vmovd_rr(src.encoding(),dest.encoding());}voidvmovd(constOperand&src,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src.kind()){caseOperand::MEM_REG_DISP:masm.vmovd_mr(src.disp(),src.base(),dest.encoding());break;caseOperand::MEM_SCALE:masm.vmovd_mr(src.disp(),src.base(),src.index(),src.scale(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvmovd(FloatRegistersrc,constOperand&dest){MOZ_ASSERT(HasSSE2());switch(dest.kind()){caseOperand::MEM_REG_DISP:masm.vmovd_rm(src.encoding(),dest.disp(),dest.base());break;caseOperand::MEM_SCALE:masm.vmovd_rm(src.encoding(),dest.disp(),dest.base(),dest.index(),dest.scale());break;caseOperand::MEM_ADDRESS32:masm.vmovq_rm(src.encoding(),dest.address());break;default:MOZ_CRASH("unexpected operand kind");}}voidvmovq(constOperand&src,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src.kind()){caseOperand::MEM_REG_DISP:masm.vmovq_mr(src.disp(),src.base(),dest.encoding());break;caseOperand::MEM_SCALE:masm.vmovq_mr(src.disp(),src.base(),src.index(),src.scale(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vmovq_mr(src.address(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvmovq(FloatRegistersrc,constOperand&dest){MOZ_ASSERT(HasSSE2());switch(dest.kind()){caseOperand::MEM_REG_DISP:masm.vmovq_rm(src.encoding(),dest.disp(),dest.base());break;caseOperand::MEM_SCALE:masm.vmovq_rm(src.encoding(),dest.disp(),dest.base(),dest.index(),dest.scale());break;default:MOZ_CRASH("unexpected operand kind");}}voidvpaddb(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vpaddb_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vpaddb_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vpaddb_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvpsubb(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vpsubb_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vpsubb_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vpsubb_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvpaddsb(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vpaddsb_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vpaddsb_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vpaddsb_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvpaddusb(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vpaddusb_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vpaddusb_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vpaddusb_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvpsubsb(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vpsubsb_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vpsubsb_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vpsubsb_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvpsubusb(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vpsubusb_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vpsubusb_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vpsubusb_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvpaddw(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vpaddw_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vpaddw_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vpaddw_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvpsubw(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vpsubw_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vpsubw_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vpsubw_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvpaddsw(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vpaddsw_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vpaddsw_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vpaddsw_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvpaddusw(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vpaddusw_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vpaddusw_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vpaddusw_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvpsubsw(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vpsubsw_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vpsubsw_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vpsubsw_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvpsubusw(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vpsubusw_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vpsubusw_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vpsubusw_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvpaddd(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vpaddd_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vpaddd_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vpaddd_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvpsubd(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vpsubd_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vpsubd_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vpsubd_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvpmuludq(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vpmuludq_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvpmuludq(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vpmuludq_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vpmuludq_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvpmullw(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vpmullw_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vpmullw_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvpmulld(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE41());switch(src1.kind()){caseOperand::FPREG:masm.vpmulld_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vpmulld_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vpmulld_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvaddps(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vaddps_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vaddps_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vaddps_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvsubps(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vsubps_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vsubps_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vsubps_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvmulps(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vmulps_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vmulps_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vmulps_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvdivps(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vdivps_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vdivps_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vdivps_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvmaxps(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vmaxps_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vmaxps_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vmaxps_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvminps(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vminps_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vminps_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vminps_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvandps(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vandps_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vandps_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vandps_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvandnps(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){// Negates bits of dest and then applies ANDMOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vandnps_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vandnps_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vandnps_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvorps(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vorps_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vorps_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vorps_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvxorps(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vxorps_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vxorps_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vxorps_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvpand(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vpand_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvpand(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vpand_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vpand_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vpand_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvpor(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vpor_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvpor(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vpor_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vpor_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vpor_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvpxor(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vpxor_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvpxor(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vpxor_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vpxor_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vpxor_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvpandn(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vpandn_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvpandn(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vpandn_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vpandn_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vpandn_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvpshufd(uint32_tmask,FloatRegistersrc,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vpshufd_irr(mask,src.encoding(),dest.encoding());}voidvpshufd(uint32_tmask,constOperand&src1,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vpshufd_irr(mask,src1.fpu(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vpshufd_imr(mask,src1.disp(),src1.base(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vpshufd_imr(mask,src1.address(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvpshuflw(uint32_tmask,FloatRegistersrc,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vpshuflw_irr(mask,src.encoding(),dest.encoding());}voidvpshufhw(uint32_tmask,FloatRegistersrc,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vpshufhw_irr(mask,src.encoding(),dest.encoding());}voidvpshufb(FloatRegistermask,FloatRegistersrc,FloatRegisterdest){MOZ_ASSERT(HasSSSE3());masm.vpshufb_rr(mask.encoding(),src.encoding(),dest.encoding());}voidvmovddup(FloatRegistersrc,FloatRegisterdest){MOZ_ASSERT(HasSSE3());masm.vmovddup_rr(src.encoding(),dest.encoding());}voidvmovhlps(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vmovhlps_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvmovlhps(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vmovlhps_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvunpcklps(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vunpcklps_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvunpcklps(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vunpcklps_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vunpcklps_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vunpcklps_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvunpckhps(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vunpckhps_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvunpckhps(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vunpckhps_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vunpckhps_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vunpckhps_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvshufps(uint32_tmask,FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vshufps_irr(mask,src1.encoding(),src0.encoding(),dest.encoding());}voidvshufps(uint32_tmask,constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vshufps_irr(mask,src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vshufps_imr(mask,src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vshufps_imr(mask,src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvaddsd(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vaddsd_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvaddss(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vaddss_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvaddsd(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vaddsd_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vaddsd_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vaddsd_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvaddss(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vaddss_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vaddss_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;caseOperand::MEM_ADDRESS32:masm.vaddss_mr(src1.address(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvsubsd(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vsubsd_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvsubss(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vsubss_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvsubsd(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vsubsd_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vsubsd_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvsubss(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vsubss_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vsubss_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvmulsd(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vmulsd_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvmulsd(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vmulsd_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vmulsd_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvmulss(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vmulss_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vmulss_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvmulss(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vmulss_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvdivsd(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vdivsd_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvdivss(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vdivss_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvdivsd(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vdivsd_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vdivsd_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvdivss(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vdivss_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vdivss_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvxorpd(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vxorpd_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvxorps(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vxorps_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvorpd(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vorpd_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvorps(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vorps_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvandpd(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vandpd_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvandps(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vandps_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvsqrtsd(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vsqrtsd_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvsqrtss(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vsqrtss_rr(src1.encoding(),src0.encoding(),dest.encoding());}staticX86Encoding::RoundingModeToX86RoundingMode(RoundingModemode){switch(mode){caseRoundingMode::Up:returnX86Encoding::RoundUp;caseRoundingMode::Down:returnX86Encoding::RoundDown;caseRoundingMode::NearestTiesToEven:returnX86Encoding::RoundToNearest;caseRoundingMode::TowardsZero:returnX86Encoding::RoundToZero;}MOZ_CRASH("unexpected mode");}voidvroundsd(X86Encoding::RoundingModemode,FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE41());masm.vroundsd_irr(mode,src1.encoding(),src0.encoding(),dest.encoding());}voidvroundss(X86Encoding::RoundingModemode,FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE41());masm.vroundss_irr(mode,src1.encoding(),src0.encoding(),dest.encoding());}unsignedvinsertpsMask(unsignedsourceLane,unsigneddestLane,unsignedzeroMask=0){// Note that the sourceLane bits are ignored in the case of a source// memory operand, and the source is the given 32-bits memory location.MOZ_ASSERT(zeroMask<16);unsignedret=zeroMask;ret|=destLane<<4;ret|=sourceLane<<6;MOZ_ASSERT(ret<256);returnret;}voidvinsertps(uint32_tmask,FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE41());masm.vinsertps_irr(mask,src1.encoding(),src0.encoding(),dest.encoding());}voidvinsertps(uint32_tmask,constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE41());switch(src1.kind()){caseOperand::FPREG:masm.vinsertps_irr(mask,src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vinsertps_imr(mask,src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}unsignedblendpsMask(boolx,booly,boolz,boolw){return(x<<0)|(y<<1)|(z<<2)|(w<<3);}voidvblendps(unsignedmask,FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE41());masm.vblendps_irr(mask,src1.encoding(),src0.encoding(),dest.encoding());}voidvblendps(unsignedmask,constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE41());switch(src1.kind()){caseOperand::FPREG:masm.vblendps_irr(mask,src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vblendps_imr(mask,src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvblendvps(FloatRegistermask,FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE41());masm.vblendvps_rr(mask.encoding(),src1.encoding(),src0.encoding(),dest.encoding());}voidvblendvps(FloatRegistermask,constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE41());switch(src1.kind()){caseOperand::FPREG:masm.vblendvps_rr(mask.encoding(),src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vblendvps_mr(mask.encoding(),src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvmovsldup(FloatRegistersrc,FloatRegisterdest){MOZ_ASSERT(HasSSE3());masm.vmovsldup_rr(src.encoding(),dest.encoding());}voidvmovsldup(constOperand&src,FloatRegisterdest){MOZ_ASSERT(HasSSE3());switch(src.kind()){caseOperand::FPREG:masm.vmovsldup_rr(src.fpu(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vmovsldup_mr(src.disp(),src.base(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvmovshdup(FloatRegistersrc,FloatRegisterdest){MOZ_ASSERT(HasSSE3());masm.vmovshdup_rr(src.encoding(),dest.encoding());}voidvmovshdup(constOperand&src,FloatRegisterdest){MOZ_ASSERT(HasSSE3());switch(src.kind()){caseOperand::FPREG:masm.vmovshdup_rr(src.fpu(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vmovshdup_mr(src.disp(),src.base(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvminsd(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vminsd_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvminsd(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vminsd_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vminsd_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvminss(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vminss_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvmaxsd(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vmaxsd_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidvmaxsd(constOperand&src1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());switch(src1.kind()){caseOperand::FPREG:masm.vmaxsd_rr(src1.fpu(),src0.encoding(),dest.encoding());break;caseOperand::MEM_REG_DISP:masm.vmaxsd_mr(src1.disp(),src1.base(),src0.encoding(),dest.encoding());break;default:MOZ_CRASH("unexpected operand kind");}}voidvmaxss(FloatRegistersrc1,FloatRegistersrc0,FloatRegisterdest){MOZ_ASSERT(HasSSE2());masm.vmaxss_rr(src1.encoding(),src0.encoding(),dest.encoding());}voidfisttp(constOperand&dest){MOZ_ASSERT(HasSSE3());switch(dest.kind()){caseOperand::MEM_REG_DISP:masm.fisttp_m(dest.disp(),dest.base());break;default:MOZ_CRASH("unexpected operand kind");}}voidfistp(constOperand&dest){switch(dest.kind()){caseOperand::MEM_REG_DISP:masm.fistp_m(dest.disp(),dest.base());break;default:MOZ_CRASH("unexpected operand kind");}}voidfnstcw(constOperand&dest){switch(dest.kind()){caseOperand::MEM_REG_DISP:masm.fnstcw_m(dest.disp(),dest.base());break;default:MOZ_CRASH("unexpected operand kind");}}voidfldcw(constOperand&dest){switch(dest.kind()){caseOperand::MEM_REG_DISP:masm.fldcw_m(dest.disp(),dest.base());break;default:MOZ_CRASH("unexpected operand kind");}}voidfnstsw(constOperand&dest){switch(dest.kind()){caseOperand::MEM_REG_DISP:masm.fnstsw_m(dest.disp(),dest.base());break;default:MOZ_CRASH("unexpected operand kind");}}voidfld(constOperand&dest){switch(dest.kind()){caseOperand::MEM_REG_DISP:masm.fld_m(dest.disp(),dest.base());break;default:MOZ_CRASH("unexpected operand kind");}}voidfld32(constOperand&dest){switch(dest.kind()){caseOperand::MEM_REG_DISP:masm.fld32_m(dest.disp(),dest.base());break;default:MOZ_CRASH("unexpected operand kind");}}voidfstp(constOperand&src){switch(src.kind()){caseOperand::MEM_REG_DISP:masm.fstp_m(src.disp(),src.base());break;default:MOZ_CRASH("unexpected operand kind");}}voidfstp32(constOperand&src){switch(src.kind()){caseOperand::MEM_REG_DISP:masm.fstp32_m(src.disp(),src.base());break;default:MOZ_CRASH("unexpected operand kind");}}// Defined for compatibility with ARM's assembleruint32_tactualIndex(uint32_tx){returnx;}voidflushBuffer(){}// Patching.staticsize_tPatchWrite_NearCallSize(){return5;}staticuintptr_tGetPointer(uint8_t*instPtr){uintptr_t*ptr=((uintptr_t*)instPtr)-1;return*ptr;}// Write a relative call at the start location |dataLabel|.// Note that this DOES NOT patch data that comes before |label|.staticvoidPatchWrite_NearCall(CodeLocationLabelstartLabel,CodeLocationLabeltarget){uint8_t*start=startLabel.raw();*start=0xE8;ptrdiff_toffset=target-startLabel-PatchWrite_NearCallSize();MOZ_ASSERT(int32_t(offset)==offset);*((int32_t*)(start+1))=offset;}staticvoidPatchWrite_Imm32(CodeLocationLabeldataLabel,Imm32toWrite){*((int32_t*)dataLabel.raw()-1)=toWrite.value;}staticvoidPatchDataWithValueCheck(CodeLocationLabeldata,PatchedImmPtrnewData,PatchedImmPtrexpectedData){// The pointer given is a pointer to *after* the data.uintptr_t*ptr=((uintptr_t*)data.raw())-1;MOZ_ASSERT(*ptr==(uintptr_t)expectedData.value);*ptr=(uintptr_t)newData.value;}staticvoidPatchDataWithValueCheck(CodeLocationLabeldata,ImmPtrnewData,ImmPtrexpectedData){PatchDataWithValueCheck(data,PatchedImmPtr(newData.value),PatchedImmPtr(expectedData.value));}staticvoidPatchInstructionImmediate(uint8_t*code,PatchedImmPtrimm){MOZ_CRASH("Unused.");}staticuint32_tNopSize(){return1;}staticuint8_t*NextInstruction(uint8_t*cur,uint32_t*count){MOZ_CRASH("nextInstruction NYI on x86");}// Toggle a jmp or cmp emitted by toggledJump().staticvoidToggleToJmp(CodeLocationLabelinst){uint8_t*ptr=(uint8_t*)inst.raw();MOZ_ASSERT(*ptr==0x3D);*ptr=0xE9;}staticvoidToggleToCmp(CodeLocationLabelinst){uint8_t*ptr=(uint8_t*)inst.raw();MOZ_ASSERT(*ptr==0xE9);*ptr=0x3D;}staticvoidToggleCall(CodeLocationLabelinst,boolenabled){uint8_t*ptr=(uint8_t*)inst.raw();MOZ_ASSERT(*ptr==0x3D||// CMP*ptr==0xE8);// CALL*ptr=enabled?0xE8:0x3D;}MOZ_COLDvoidverifyHeapAccessDisassembly(uint32_tbegin,uint32_tend,constDisassembler::HeapAccess&heapAccess);};}// namespace jit}// namespace js#endif /* jit_x86_shared_Assembler_x86_shared_h */